package model.arbolBSharp;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import model.registro.RegistroHoja;

public class ConversorBytesRegistroHoja extends ConversorBytes {

		
		private Integer cantidadAConvertir;
		private List<RegistroHoja> listaRegistros;
		
		public Integer getCantidadAConvertir() {
			return cantidadAConvertir;
		}
		public void setCantidadAConvertir(Integer cantidadAConvertir) {
			this.cantidadAConvertir = cantidadAConvertir;
		}
		public List<RegistroHoja> getListaRegistros() {
			return listaRegistros;
		}
		public void setListaRegistros(List<RegistroHoja> listaRegistros) {
			this.listaRegistros = listaRegistros;
		}
		/*
		 * Obtiene el RegistroHoja desde la cadena de bytes que recibe
		 */
		public void convertirAObjetos(InputStream in) throws IOException {
			if (in == null)
				throw new NullPointerException("input");
			
			if (cantidadAConvertir==null)
				throw new NullPointerException("Cantidad de registros seteada");
			
			int i = cantidadAConvertir;
			
			DataInputStream input = new DataInputStream(in);
			
			listaRegistros = new ArrayList<RegistroHoja>(cantidadAConvertir);
			int caracteresAnteriores = 0;
			int caracteresNuevos = 0;
			float pesoGlobal =0;
			int offSet = 0;
			
			while(i>0){
				i--;
				RegistroHoja reg = new RegistroHoja();
				caracteresAnteriores = input.read();
				caracteresNuevos = input.read();

				byte[] arrayBytesTermino = new byte[caracteresNuevos];	
				input.read(arrayBytesTermino);
				String nuevoTermino = new String(arrayBytesTermino);
				
				
				pesoGlobal = input.readFloat();
				offSet = input.read();
				
				reg.setCantCaractRepetidos(caracteresAnteriores);
				reg.setCantCaractNuevos(caracteresNuevos);
				reg.setTerm(nuevoTermino);
				reg.setPesoGlobal(pesoGlobal);
				reg.setOffset(offSet);
				listaRegistros.add(reg);
			}		
		}
		
		/*
		 * Obtiene la cadena de bytes desde la lista de RegistroHoja
		 */		
		public void convertirABytes(OutputStream out) throws IOException {
			if (out == null)
				throw new NullPointerException("output");
			
			if(listaRegistros==null)
				throw new NullPointerException();
			
			if (listaRegistros.size() == 0)
				return;

			DataOutputStream output = new DataOutputStream(out);

			for(RegistroHoja reg : listaRegistros){
				output.write(reg.getCantCaractRepetidos());
				output.write(reg.getCantCaractNuevos());
				output.write(reg.getTermino().getBytes(), 0, reg.getCantCaractNuevos());
				output.writeFloat(reg.getPesoGlobal());
				output.write(reg.getOffset());
			}
		}
}

	


